package com.dingqb.ktdemo.oop.inherited

open class Iinterface {

	fun setOnclick(onclick: Onclick) {
		onclick.click("this is a interface callback!");
	}

}


open interface MyInterface {
	fun bar()    // 未实现
	fun foo() {  //已实现
		// 可选的方法体
		println("foo")
	}
}


class exI : MyInterface {
	override fun bar() {
		// 方法体
	}
}


open class A {

}

class B : A() {
}

fun main(args: Array<String>) {
	// 使用匿名接口实现类 非常规但使用的比较多。类似java中的匿名内部类的使用
	var iinterface = Iinterface();
	iinterface.setOnclick(object : Onclick {
		override fun click(view: Any) {
			println(view);
		}

		override fun impClick() {
			println("imp click");
		}
	});

	// 常规使用接口， 定义一个类，实现该接口， 然后把实现类该接口的类作为参数传入到方法中去。
	var t = tt();
	iinterface.setOnclick(t);

	// 使用继承，主构造器， 次构造器， 方法的复写，属性的复写。
	val student = Student("stu1", 18);
//	student.f();
	println(student.v22)
//	val student2 = Student1("stu2");

}

class tt : Onclick, Any() {
	override fun click(view: Any) {

		println(view);

	}
};



interface Onclick {
	fun click(view: Any);
	public fun impClick() {
		println("impClick");
	}
}


open class Person(tt: String) {
	open val v: Int = 1;
	open var v1: Int = 1;
	open var v2: Int = 1;

	constructor(name1: String, age: String) : this(name1) {
		println("Persion constructor $name1,$age");
	}

	init {
		println("Person init $tt");
	}

	open fun f() {
		println("Person f()");
	}

}

class Student constructor(name1: String) : Person(name1) {
	override var v: Int = 10;
	override var v1: Int = 11;

	var v22: Int = 12
		set(value) {
			if (value == 12) {
				field = 12000;
			} else {
				field = 1212;
			}
		}
		get() = field;

	init {
		println("Student init $name1");
	}

	constructor(name: String, age: Int) : this(name) {
		println("Student constructor $name, age==$age");


	}

	override fun f() {
		super<Person>.f();
		println("Student f()--");
	}


}

class Student1 : Person {

	init {
		println("Student1 init");
	}

	constructor(name: String) : super(name, "age") {
		println("Student1 constructor $name");

	}

}




